МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
ЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
/
Лабораторна робота №6
з курсу
”Засоби системного програмування”
Використання макрокоманд та процедур.
Ввід даних з клавіатури та вивід результату на екран.
.
Львів – 2012
Мета: набути навиків написання макрокоманд та процедур на Асемблері, освоїти способи передачі параметрів. Реалізувати ввід та вивід даних в десятковій системі числення.
Завдання:
12
X=K+B4/C2-D2*F2-E1
7055E0AC
Лістинг програми
DOSSEG
.MODEL SMALL
MY_MUL MACRO X,Y,Z
mov z,0
mov z+2,0
MOV AX,X
MUL Y
MOV Z,AX
MOV Z+2,DX
MOV AX,X+2
MUL Y
ADD Z+2,AX
mov ax,Z
mov dx,Z+2
ENDM
.STACK 100h
.DATA
K_low EQU 0E0ACh
K_high EQU 7055h
B dd 00h
C dw 00h
D dw 00h
E db 00h
F dw 00h
Temp1 dw 00h,00h
Temp2 dw 00h
Temp3 dw 00h
Temp4 dw 00h
X dw 00h,00h
X_Str db 10 dup (0)
TempStr db 10 dup (0)
TempBin dw 0,0
MaxLen dw 0
X_div2 dw 0,0
Y_div2 dw 0
MESSG_X DB 13,10,'X=X=K+B(4)/C(2)-D(2)*F(2)-E(1) К=1884647268 (7055E0AC)','$'
MESSG_B DB 13,10,'B= ','$'
MESSG_C DB 13,10,'C= ','$'
MESSG_D DB 13,10,'D= ','$'
MESSG_E DB 13,10,'E= ','$'
MESSG_F DB 13,10,'F= ','$'
MESSG_X1 DB 13,10,'X= ','$'
erStr1 db 13,10,'Data not input_variable',13,10,'$'
erStr2 db 13,10,'Incorrectly data ',13,10,'$'
erStr2_1 db 13,10,' D =0 --> divide by zero ',13,10,'$'
erStr3 db 13,10,'Data is too long ',13,10,'$'
Mult10 dw 1,0
my_z dw 0,0
.CODE
mov ax,@data
mov ds,ax
call input
call calculation
call output
mov ah,01
int 21h
mov ah,4Ch
int 21h
input proc
LEA DX,MESSG_X
MOV AH,09
INT 21H
LEA DX,MESSG_B
MOV AH,09
INT 21H
mov di,offset B
mov MaxLen,3
mov cx,MaxLen
call input_variable
LEA DX,MESSG_C
MOV AH,09
INT 21H
mov di,offset C
mov MaxLen,5
mov cx,MaxLen
call input_variable
LEA DX,MESSG_D
MOV AH,09
INT 21H
mov di,offset D
mov MaxLen,3
mov cx,MaxLen
call input_variable
cmp D,0
jne dali
mov ah,09
mov dx, offset erStr2_1
int 21h
mov ah,4Ch
int 21h
dali: LEA DX,MESSG_E
MOV AH,09
INT 21H
mov di,offset E
mov MaxLen,3
mov cx,MaxLen
call input_variable
LEA DX,MESSG_F
MOV AH,09
INT 21H
mov di,offset F
mov MaxLen,3
mov cx,MaxLen
call input_variable
ret
input endp
calculation proc
xor ax,ax
xor bx,bx
xor cx,cx
xor dx,dx
mov ax,D ;
mul F
mov [Temp1+0], ax;
mov [Temp1+2], dx;
mov ax,0
mov ax,word ptr[Temp1]
mov bh,00
mov bl,E
sub ax,bx
sbb word ptr[Temp1+2],0
mov word ptr[Temp3+0],ax
mov word ptr[Temp3+2],dx
mov ax,0
mov ax,word ptr[B]
mov dx,word ptr[B+2]
div C
mov dx,K_high
add ax,K_low
mov [Temp2+0],ax
adc dx,0
mov [Temp2+2],dx
mov ax,word ptr[Temp2+0]
mov dx,word ptr[Temp3+0]
sub ax,dx
mov [X],ax
mov ax,word ptr[Temp2+2]
mov dx,word ptr[Temp3+2]
sbb ax,dx
mov [X+2],ax
sbb [X+4],0
ret
calculation endp
input_variable PROC
mov si,0
In_00: mov ah,01
int 21h
cmp al,0Dh
je In_1
In_0: mov dl,al
call CHECK_BYTE
mov TempStr[si],dl
inc si
loop In_00
In_1: push si
dec si
cmp cx,MaxLen
jne In_2
call Err1
In_2: mov bh,0
mov bl,TempStr[si]
MY_MUL Mult10,bx,my_z
add TempBin,ax
adc TempBin+2,dx
mov bh,0
mov bl,10
MY_MUL Mult10,bx,my_z
mov Mult10,ax
mov Mult10+2,dx
dec si
cmp si,0
jge In_2
mov ax, TempBin
mov dx,TempBin+2
pop si
cmp...